Implement new sane, 5-function API for using GtkProgressBar. See
authorHavoc Pennington <hp@redhat.com>
Tue, 25 Jul 2000 22:58:17 +0000 (22:58 +0000)
committerHavoc Pennington <hp@src.gnome.org>
Tue, 25 Jul 2000 22:58:17 +0000 (22:58 +0000)
2000-07-25  Havoc Pennington  <hp@redhat.com>

* gtk/gtkprogressbar.h: Implement new sane, 5-function API for
using GtkProgressBar. See Changes-2.0.txt for details.

* gtk/gtkprogressbar.c: Add object arguments "fraction" and
"pulse_step" which are the equivalent of
gtk_progress_bar_set_pulse_step and gtk_progress_bar_set_fraction.
Implement new API.

* gtk/gtkprogress.h (struct _GtkProgress): Add a field
(use_text_format) to mark whether text set on the progress bar is
a format string. Deprecate entire GtkProgress interface.

* gtk/gtkprogress.c (gtk_progress_init): init use_text_format to TRUE
(gtk_progress_build_string): make this a no-op if use_text_format
is FALSE

* docs/Changes-2.0.txt: Describe progress bar changes.

12 files changed:
ChangeLog
ChangeLog.pre-2-0
ChangeLog.pre-2-10
ChangeLog.pre-2-2
ChangeLog.pre-2-4
ChangeLog.pre-2-6
ChangeLog.pre-2-8
docs/Changes-2.0.txt
gtk/gtkprogress.c
gtk/gtkprogress.h
gtk/gtkprogressbar.c
gtk/gtkprogressbar.h

index 0b3adb73e77d8c4c0156f8122cf5e6041cdc974f..5691db40552d1d56af3841ec684a7acc7028b78b 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,23 @@
+2000-07-25  Havoc Pennington  <hp@redhat.com>
+
+       * gtk/gtkprogressbar.h: Implement new sane, 5-function API for
+       using GtkProgressBar. See Changes-2.0.txt for details.
+
+       * gtk/gtkprogressbar.c: Add object arguments "fraction" and
+       "pulse_step" which are the equivalent of
+       gtk_progress_bar_set_pulse_step and gtk_progress_bar_set_fraction.
+       Implement new API.
+       
+       * gtk/gtkprogress.h (struct _GtkProgress): Add a field
+       (use_text_format) to mark whether text set on the progress bar is
+       a format string. Deprecate entire GtkProgress interface.
+
+       * gtk/gtkprogress.c (gtk_progress_init): init use_text_format to TRUE
+       (gtk_progress_build_string): make this a no-op if use_text_format
+       is FALSE
+
+       * docs/Changes-2.0.txt: Describe progress bar changes.
+
 2000-07-25  Tor Lillqvist  <tml@iki.fi>
 
        * Makefile.am: Include the build directory.
index 0b3adb73e77d8c4c0156f8122cf5e6041cdc974f..5691db40552d1d56af3841ec684a7acc7028b78b 100644 (file)
@@ -1,3 +1,23 @@
+2000-07-25  Havoc Pennington  <hp@redhat.com>
+
+       * gtk/gtkprogressbar.h: Implement new sane, 5-function API for
+       using GtkProgressBar. See Changes-2.0.txt for details.
+
+       * gtk/gtkprogressbar.c: Add object arguments "fraction" and
+       "pulse_step" which are the equivalent of
+       gtk_progress_bar_set_pulse_step and gtk_progress_bar_set_fraction.
+       Implement new API.
+       
+       * gtk/gtkprogress.h (struct _GtkProgress): Add a field
+       (use_text_format) to mark whether text set on the progress bar is
+       a format string. Deprecate entire GtkProgress interface.
+
+       * gtk/gtkprogress.c (gtk_progress_init): init use_text_format to TRUE
+       (gtk_progress_build_string): make this a no-op if use_text_format
+       is FALSE
+
+       * docs/Changes-2.0.txt: Describe progress bar changes.
+
 2000-07-25  Tor Lillqvist  <tml@iki.fi>
 
        * Makefile.am: Include the build directory.
index 0b3adb73e77d8c4c0156f8122cf5e6041cdc974f..5691db40552d1d56af3841ec684a7acc7028b78b 100644 (file)
@@ -1,3 +1,23 @@
+2000-07-25  Havoc Pennington  <hp@redhat.com>
+
+       * gtk/gtkprogressbar.h: Implement new sane, 5-function API for
+       using GtkProgressBar. See Changes-2.0.txt for details.
+
+       * gtk/gtkprogressbar.c: Add object arguments "fraction" and
+       "pulse_step" which are the equivalent of
+       gtk_progress_bar_set_pulse_step and gtk_progress_bar_set_fraction.
+       Implement new API.
+       
+       * gtk/gtkprogress.h (struct _GtkProgress): Add a field
+       (use_text_format) to mark whether text set on the progress bar is
+       a format string. Deprecate entire GtkProgress interface.
+
+       * gtk/gtkprogress.c (gtk_progress_init): init use_text_format to TRUE
+       (gtk_progress_build_string): make this a no-op if use_text_format
+       is FALSE
+
+       * docs/Changes-2.0.txt: Describe progress bar changes.
+
 2000-07-25  Tor Lillqvist  <tml@iki.fi>
 
        * Makefile.am: Include the build directory.
index 0b3adb73e77d8c4c0156f8122cf5e6041cdc974f..5691db40552d1d56af3841ec684a7acc7028b78b 100644 (file)
@@ -1,3 +1,23 @@
+2000-07-25  Havoc Pennington  <hp@redhat.com>
+
+       * gtk/gtkprogressbar.h: Implement new sane, 5-function API for
+       using GtkProgressBar. See Changes-2.0.txt for details.
+
+       * gtk/gtkprogressbar.c: Add object arguments "fraction" and
+       "pulse_step" which are the equivalent of
+       gtk_progress_bar_set_pulse_step and gtk_progress_bar_set_fraction.
+       Implement new API.
+       
+       * gtk/gtkprogress.h (struct _GtkProgress): Add a field
+       (use_text_format) to mark whether text set on the progress bar is
+       a format string. Deprecate entire GtkProgress interface.
+
+       * gtk/gtkprogress.c (gtk_progress_init): init use_text_format to TRUE
+       (gtk_progress_build_string): make this a no-op if use_text_format
+       is FALSE
+
+       * docs/Changes-2.0.txt: Describe progress bar changes.
+
 2000-07-25  Tor Lillqvist  <tml@iki.fi>
 
        * Makefile.am: Include the build directory.
index 0b3adb73e77d8c4c0156f8122cf5e6041cdc974f..5691db40552d1d56af3841ec684a7acc7028b78b 100644 (file)
@@ -1,3 +1,23 @@
+2000-07-25  Havoc Pennington  <hp@redhat.com>
+
+       * gtk/gtkprogressbar.h: Implement new sane, 5-function API for
+       using GtkProgressBar. See Changes-2.0.txt for details.
+
+       * gtk/gtkprogressbar.c: Add object arguments "fraction" and
+       "pulse_step" which are the equivalent of
+       gtk_progress_bar_set_pulse_step and gtk_progress_bar_set_fraction.
+       Implement new API.
+       
+       * gtk/gtkprogress.h (struct _GtkProgress): Add a field
+       (use_text_format) to mark whether text set on the progress bar is
+       a format string. Deprecate entire GtkProgress interface.
+
+       * gtk/gtkprogress.c (gtk_progress_init): init use_text_format to TRUE
+       (gtk_progress_build_string): make this a no-op if use_text_format
+       is FALSE
+
+       * docs/Changes-2.0.txt: Describe progress bar changes.
+
 2000-07-25  Tor Lillqvist  <tml@iki.fi>
 
        * Makefile.am: Include the build directory.
index 0b3adb73e77d8c4c0156f8122cf5e6041cdc974f..5691db40552d1d56af3841ec684a7acc7028b78b 100644 (file)
@@ -1,3 +1,23 @@
+2000-07-25  Havoc Pennington  <hp@redhat.com>
+
+       * gtk/gtkprogressbar.h: Implement new sane, 5-function API for
+       using GtkProgressBar. See Changes-2.0.txt for details.
+
+       * gtk/gtkprogressbar.c: Add object arguments "fraction" and
+       "pulse_step" which are the equivalent of
+       gtk_progress_bar_set_pulse_step and gtk_progress_bar_set_fraction.
+       Implement new API.
+       
+       * gtk/gtkprogress.h (struct _GtkProgress): Add a field
+       (use_text_format) to mark whether text set on the progress bar is
+       a format string. Deprecate entire GtkProgress interface.
+
+       * gtk/gtkprogress.c (gtk_progress_init): init use_text_format to TRUE
+       (gtk_progress_build_string): make this a no-op if use_text_format
+       is FALSE
+
+       * docs/Changes-2.0.txt: Describe progress bar changes.
+
 2000-07-25  Tor Lillqvist  <tml@iki.fi>
 
        * Makefile.am: Include the build directory.
index 0b3adb73e77d8c4c0156f8122cf5e6041cdc974f..5691db40552d1d56af3841ec684a7acc7028b78b 100644 (file)
@@ -1,3 +1,23 @@
+2000-07-25  Havoc Pennington  <hp@redhat.com>
+
+       * gtk/gtkprogressbar.h: Implement new sane, 5-function API for
+       using GtkProgressBar. See Changes-2.0.txt for details.
+
+       * gtk/gtkprogressbar.c: Add object arguments "fraction" and
+       "pulse_step" which are the equivalent of
+       gtk_progress_bar_set_pulse_step and gtk_progress_bar_set_fraction.
+       Implement new API.
+       
+       * gtk/gtkprogress.h (struct _GtkProgress): Add a field
+       (use_text_format) to mark whether text set on the progress bar is
+       a format string. Deprecate entire GtkProgress interface.
+
+       * gtk/gtkprogress.c (gtk_progress_init): init use_text_format to TRUE
+       (gtk_progress_build_string): make this a no-op if use_text_format
+       is FALSE
+
+       * docs/Changes-2.0.txt: Describe progress bar changes.
+
 2000-07-25  Tor Lillqvist  <tml@iki.fi>
 
        * Makefile.am: Include the build directory.
index 5b4f2507d741252ae2eb0e37e7b70c966e87c945..14cb9d0098d745df30e536208823056ada7a8944 100644 (file)
@@ -189,4 +189,44 @@ Incompatible Changes from GTK+-1.2 to GTK+-1.4:
   to the behavior of gdk_window_foreign_new(), and fixes a lot
   of problems with code where the pixmap wasn't supposed to be
   freed. If XFreePixmap() is needed, it can be done using the
-  destroy-notification facilities of g_object_set_data().
\ No newline at end of file
+  destroy-notification facilities of g_object_set_data().
+
+-  GtkProgress/GtkProgressBar had serious problems in GTK 1.2.
+  - Only 3 or 4 functions are really needed for 95% of progress  
+    interfaces; GtkProgress[Bar] had about 25 functions, and 
+    didn't even include these 3 or 4.
+  - In activity mode, the API involves setting the adjustment 
+    to any random value, just to have the side effect of 
+    calling the progress bar update function - the adjustment
+    is totally ignored in activity mode
+  - You set the activity step as a pixel value, which means to 
+    set the activity step you basically need to connect to 
+    size_allocate
+  - There are ctree_set_expander_style()-functions, to randomly 
+    change look-and-feel for no good reason
+  - The split between GtkProgress and GtkProgressBar makes no sense 
+    to me whatsoever.
+  
+ This was a big wart on GTK and made people waste lots of time,
+ both learning and using the interface.
+ So, we have added what we feel is the correct API, and marked all the
+ rest deprecated. However, the changes are 100% backward-compatible and
+ should break no existing code.
+
+ The following 5 functions are the new programming interface and you 
+ should consider changing your code to use them:
+  void       gtk_progress_bar_pulse                (GtkProgressBar *pbar);
+  void       gtk_progress_bar_set_text             (GtkProgressBar *pbar,
+                                                    const gchar    *text);
+  void       gtk_progress_bar_set_fraction         (GtkProgressBar *pbar,
+                                                    gfloat          fraction);
+
+  void       gtk_progress_bar_set_pulse_step       (GtkProgressBar *pbar,
+                                                    gfloat          fraction);
+  void       gtk_progress_bar_set_orientation      (GtkProgressBar *pbar,
+                                                   GtkProgressBarOrientation orientation);
+
+
index 44ed4f4e89d6656eb5d135f56385dd644e81f82f..4d31ce8943efb0f926cf3e283d401bb90f67c9e1 100644 (file)
@@ -198,6 +198,7 @@ gtk_progress_init (GtkProgress *progress)
   progress->y_align = 0.5;
   progress->show_text = FALSE;
   progress->activity_mode = FALSE;
+  progress->use_text_format = TRUE;
 }
 
 static void
@@ -357,6 +358,13 @@ gtk_progress_build_string (GtkProgress *progress,
   gchar fmt[10];
 
   src = progress->format;
+
+  /* This is the new supported version of this function */
+  if (!progress->use_text_format)
+    return g_strdup (src);
+
+  /* And here's all the deprecated goo. */
+  
   dest = buf;
  
   while (src && *src)
@@ -624,6 +632,11 @@ gtk_progress_set_format_string (GtkProgress *progress,
   g_return_if_fail (progress != NULL);
   g_return_if_fail (GTK_IS_PROGRESS (progress));
 
+  /* Turn on format, in case someone called
+   * gtk_progress_bar_set_text() and turned it off.
+   */
+  progress->use_text_format = TRUE;
+  
   if (format)
     {
       if (progress->format)
index 5bf18f0ec116c3de8ff805e89c282402fd94af46..11ab48d9b0e98c7c6da972602afd3361a21cbc71 100644 (file)
@@ -62,6 +62,7 @@ struct _GtkProgress
 
   guint          show_text : 1;
   guint          activity_mode : 1;
+  guint          use_text_format : 1;
 };
 
 struct _GtkProgressClass
@@ -73,6 +74,9 @@ struct _GtkProgressClass
   void (* act_mode_enter)   (GtkProgress *progress);
 };
 
+/* This entire interface is deprecated. Use GtkProgressBar
+ * directly.
+ */
 
 GtkType    gtk_progress_get_type            (void);
 void       gtk_progress_set_show_text       (GtkProgress   *progress,
index e1db4c6b93f0b37be10f50713b8e797ba63c09fd..562fd3d3a234044f33b4d890ee52b70f6de49e94 100644 (file)
@@ -52,7 +52,9 @@ enum {
   ARG_BAR_STYLE,
   ARG_ACTIVITY_STEP,
   ARG_ACTIVITY_BLOCKS,
-  ARG_DISCRETE_BLOCKS
+  ARG_DISCRETE_BLOCKS,
+  ARG_FRACTION,
+  ARG_PULSE_STEP
 };
 
 static void gtk_progress_bar_class_init    (GtkProgressBarClass *klass);
@@ -130,7 +132,15 @@ gtk_progress_bar_class_init (GtkProgressBarClass *class)
                           GTK_TYPE_UINT,
                           GTK_ARG_READWRITE,
                           ARG_DISCRETE_BLOCKS);
-
+  gtk_object_add_arg_type ("GtkProgressBar::fraction",
+                          GTK_TYPE_FLOAT,
+                          GTK_ARG_READWRITE,
+                          ARG_FRACTION);
+  gtk_object_add_arg_type ("GtkProgressBar::pulse_step",
+                          GTK_TYPE_FLOAT,
+                          GTK_ARG_READWRITE,
+                          ARG_FRACTION);
+  
   object_class->set_arg = gtk_progress_bar_set_arg;
   object_class->get_arg = gtk_progress_bar_get_arg;
 
@@ -148,6 +158,7 @@ gtk_progress_bar_init (GtkProgressBar *pbar)
   pbar->blocks = 10;
   pbar->in_block = -1;
   pbar->orientation = GTK_PROGRESS_LEFT_TO_RIGHT;
+  pbar->pulse_fraction = 0.1;
   pbar->activity_pos = 0;
   pbar->activity_dir = 1;
   pbar->activity_step = 3;
@@ -183,6 +194,12 @@ gtk_progress_bar_set_arg (GtkObject           *object,
     case ARG_DISCRETE_BLOCKS:
       gtk_progress_bar_set_discrete_blocks (pbar, GTK_VALUE_UINT (*arg));
       break;
+    case ARG_FRACTION:
+      gtk_progress_bar_set_fraction (pbar, GTK_VALUE_FLOAT (*arg));
+      break;
+    case ARG_PULSE_STEP:
+      gtk_progress_bar_set_pulse_step (pbar, GTK_VALUE_FLOAT (*arg));
+      break;
     default:
       break;
     }
@@ -217,6 +234,12 @@ gtk_progress_bar_get_arg (GtkObject           *object,
     case ARG_DISCRETE_BLOCKS:
       GTK_VALUE_UINT (*arg) = pbar->blocks;
       break;
+    case ARG_FRACTION:
+      GTK_VALUE_FLOAT (*arg) = gtk_progress_get_current_percentage (GTK_PROGRESS (pbar));
+      break;
+    case ARG_PULSE_STEP:
+      GTK_VALUE_FLOAT (*arg) = pbar->pulse_fraction;
+      break;
     default:
       arg->type = GTK_TYPE_INVALID;
       break;
@@ -266,12 +289,16 @@ gtk_progress_bar_real_update (GtkProgress *progress)
       if (GTK_PROGRESS (pbar)->activity_mode)
        {
          guint size;
-
+          
          /* advance the block */
 
          if (pbar->orientation == GTK_PROGRESS_LEFT_TO_RIGHT ||
              pbar->orientation == GTK_PROGRESS_RIGHT_TO_LEFT)
            {
+              /* Update our activity step. */
+              
+              pbar->activity_step = widget->allocation.width * pbar->pulse_fraction;
+              
              size = MAX (2, widget->allocation.width / pbar->activity_blocks);
 
              if (pbar->activity_dir == 0)
@@ -298,6 +325,10 @@ gtk_progress_bar_real_update (GtkProgress *progress)
            }
          else
            {
+              /* Update our activity step. */
+              
+              pbar->activity_step = widget->allocation.height * pbar->pulse_fraction;
+              
              size = MAX (2, widget->allocation.height / pbar->activity_blocks);
 
              if (pbar->activity_dir == 0)
@@ -746,6 +777,68 @@ gtk_progress_bar_paint (GtkProgress *progress)
 
 /*******************************************************************/
 
+void
+gtk_progress_bar_set_fraction (GtkProgressBar *pbar,
+                               gfloat          fraction)
+{
+  g_return_if_fail (pbar != NULL);
+  g_return_if_fail (GTK_IS_PROGRESS_BAR (pbar));
+
+  /* If we know the percentage, we don't want activity mode. */
+  gtk_progress_set_activity_mode (GTK_PROGRESS (pbar), FALSE);
+  
+  /* We use the deprecated GtkProgress interface internally.
+   * Once everything's been deprecated for a good long time,
+   * we can clean up all this code.
+   */
+  gtk_progress_set_percentage (GTK_PROGRESS (pbar), fraction);
+}
+
+void
+gtk_progress_bar_pulse (GtkProgressBar *pbar)
+{  
+  g_return_if_fail (pbar != NULL);
+  g_return_if_fail (GTK_IS_PROGRESS_BAR (pbar));
+
+  /* If we don't know the percentage, we must want activity mode. */
+  gtk_progress_set_activity_mode (GTK_PROGRESS (pbar), TRUE);
+
+  /* Sigh. */
+  gtk_progress_bar_real_update (GTK_PROGRESS (pbar));
+}
+
+void
+gtk_progress_bar_set_text (GtkProgressBar *pbar,
+                           const gchar *text)
+{
+  g_return_if_fail (pbar != NULL);
+  g_return_if_fail (GTK_IS_PROGRESS_BAR (pbar));
+  
+  /* We don't support formats in this interface */
+  GTK_PROGRESS (pbar)->use_text_format = FALSE;
+  
+  if (text && *text)
+    {
+      gtk_progress_set_show_text (GTK_PROGRESS (pbar), TRUE);
+      gtk_progress_set_format_string (GTK_PROGRESS (pbar), text);
+    }
+  else
+    {
+      gtk_progress_set_show_text (GTK_PROGRESS (pbar), FALSE);
+      gtk_progress_set_format_string (GTK_PROGRESS (pbar), "");
+    }
+}
+
+void
+gtk_progress_bar_set_pulse_step   (GtkProgressBar *pbar,
+                                   gfloat          fraction)
+{
+  g_return_if_fail (pbar != NULL);
+  g_return_if_fail (GTK_IS_PROGRESS_BAR (pbar));
+  
+  pbar->pulse_fraction = fraction;
+}
+
 void
 gtk_progress_bar_update (GtkProgressBar *pbar,
                         gfloat          percentage)
@@ -753,10 +846,9 @@ gtk_progress_bar_update (GtkProgressBar *pbar,
   g_return_if_fail (pbar != NULL);
   g_return_if_fail (GTK_IS_PROGRESS_BAR (pbar));
 
-  /***********************************************************************
-   *          Use of gtk_progress_bar_update() is deprecated !          * 
-   * Use gtk_progress_set_value or gtk_progress_set_percentage instead.  *
-   ***********************************************************************/
+  /* Use of gtk_progress_bar_update() is deprecated ! 
+   * Use gtk_progress_bar_set_percentage ()
+   */   
 
   gtk_progress_set_percentage (GTK_PROGRESS (pbar), percentage);
 }
index 7db79df174dfaaaeb84668322982e47d9d703c5c..0296be19541b4f70226639d0e97d271c052a0cbd 100644 (file)
@@ -75,6 +75,9 @@ struct _GtkProgressBar
   gint  activity_pos;
   guint activity_step;
   guint activity_blocks;
+
+  gfloat pulse_fraction;
+  
   guint activity_dir : 1;
 };
 
@@ -86,21 +89,62 @@ struct _GtkProgressBarClass
 
 GtkType    gtk_progress_bar_get_type             (void);
 GtkWidget* gtk_progress_bar_new                  (void);
+
+/*
+ * GtkProgress/GtkProgressBar had serious problems in GTK 1.2.
+ * 
+ *  - Only 3 or 4 functions are really needed for 95% of progress  
+ *    interfaces; GtkProgress[Bar] had about 25 functions, and 
+ *    didn't even include these 3 or 4.
+ *  - In activity mode, the API involves setting the adjustment 
+ *    to any random value, just to have the side effect of 
+ *    calling the progress bar update function - the adjustment
+ *    is totally ignored in activity mode
+ *  - You set the activity step as a pixel value, which means to 
+ *    set the activity step you basically need to connect to 
+ *    size_allocate
+ *  - There are ctree_set_expander_style()-functions, to randomly 
+ *    change look-and-feel for no good reason
+ *  - The split between GtkProgress and GtkProgressBar makes no sense 
+ *    to me whatsoever.
+ *  
+ * This was a big wart on GTK and made people waste lots of time,
+ * both learning and using the interface.
+ * 
+ * So, I have added what I feel is the correct API, and marked all the
+ * rest deprecated. However, the changes are 100% backward-compatible and
+ * should break no existing code.
+ *
+ * The following 5 functions are the new programming interface. 
+ */
+void       gtk_progress_bar_pulse                (GtkProgressBar *pbar);
+void       gtk_progress_bar_set_text             (GtkProgressBar *pbar,
+                                                  const gchar    *text);
+void       gtk_progress_bar_set_fraction         (GtkProgressBar *pbar,
+                                                  gfloat          fraction);
+
+void       gtk_progress_bar_set_pulse_step       (GtkProgressBar *pbar,
+                                                  gfloat          fraction);
+void       gtk_progress_bar_set_orientation      (GtkProgressBar *pbar,
+                                                 GtkProgressBarOrientation orientation);
+
+/* Everything below here is deprecated */
 GtkWidget* gtk_progress_bar_new_with_adjustment  (GtkAdjustment  *adjustment);
 void       gtk_progress_bar_set_bar_style        (GtkProgressBar *pbar,
                                                  GtkProgressBarStyle style);
 void       gtk_progress_bar_set_discrete_blocks  (GtkProgressBar *pbar,
                                                  guint           blocks);
+/* set_activity_step() is not only deprecated, it doesn't even work.
+ * (Of course, it wasn't usable anyway, you had to set it from a size_allocate
+ * handler or something)
+ */
 void       gtk_progress_bar_set_activity_step    (GtkProgressBar *pbar,
                                                   guint           step);
 void       gtk_progress_bar_set_activity_blocks  (GtkProgressBar *pbar,
                                                  guint           blocks);
-void       gtk_progress_bar_set_orientation      (GtkProgressBar *pbar,
-                                                 GtkProgressBarOrientation orientation);
 void       gtk_progress_bar_update               (GtkProgressBar *pbar,
                                                  gfloat          percentage);
 
-
 #ifdef __cplusplus
 }
 #endif /* __cplusplus */